/*
等待线程完成
*/
#include <thread>
#include <iostream>

void do_something(int& i)
{
    ++i;
}

struct func
{
    int& i;

    func(int& i_):i(i_){}

    void operator()()
    {
        for(unsigned j=0;j<1000;++j)
        {
            do_something(i);
            std::cout << i << std::endl;
        }
    }
};

void do_something_in_current_thread()
{}

void f()
{
    int some_local_state=0;
    func my_func(some_local_state);
    std::thread t(my_func);
    try
    {
        do_something_in_current_thread();
    }
    catch(...)
    {
        t.join(); 
        throw;
    }
    t.join();   //确保局部变量在县城完成后在释放，简单粗暴的等待或不等待
    //只能 join 一次，之后joinable 返回 false ，不再与已经完成的线程有任何联系
    std::cout << "joinable: " << t.joinable() << std::endl;  // 0
}

int main()
{
    f();
}
